# newBing给出的测试代码


# 具体来说，这些代码可以分为以下几个部分：
# 导入必要的模块：这里我们导入了 sys, cv2, numpy 等常用模块，以及 PyQt5 的相关组件和 openpose 的 Python 模块。
# 创建一个 pyopenpose 对象，指定模型路径和参数：
#       这里我们创建了一个 op.WrapperPython 类的实例，并传入了一些参数，如模型文件夹的位置。
#       然后我们调用 start 方法来初始化 openpose。
# 创建一个 PyQt 窗口，显示摄像头画面和姿态估计结果：
#       这里我们创建了一个 QApplication 和 QWidget 的实例，并设置了窗口的标题和大小。
#       然后我们创建了两个 QLabel 的实例，并放置在窗口上。接着我们打开摄像头，并进入一个循环。
# 从摄像头读取一帧图像，并转换为 RGB 格式：
#       这里我们使用 cv2.VideoCapture 来读取摄像头的视频流，并检查是否成功。
#       如果成功，我们将图像从 BGR 格式转换为 RGB 格式，因为 openpose 需要 RGB 格式的输入。
# 将图像传入 openpose 处理，得到人体关键点和渲染图像：
#       这里我们创建了一个 op.Datum 类的实例，并将输入图像赋值给它的 cvInputData 属性。然后我们调用 opWrapper.emplaceAndPop 方法来处理输入数据，并得到输出数据。
#       输出数据包含了人体关键点和渲染图像，分别存储在 datum.poseKeypoints 和 datum.cvOutputData 属性中。
# 将原始图像和渲染图像转换为 QImage 格式，并显示在标签上：
#       这里我们需要将 numpy 数组格式的图像转换为 PyQt 可以显示的 QImage 格式。
#       为此，我们需要获取图像的高度、宽度、通道数、每行字节数等信息，并使用 QImage 构造函数来创建 QImage 对象。
#       然后我们使用 scaled 方法来调整图像大小与标签大小相匹配，并使用 QPixmap.fromImage 方法来创建 QPixmap 对象。
#       最后，我们使用 setPixmap 方法来将 QPixmap 对象显示在标签上。
# 维持窗口更新，并处理退出事件：
#       这里我们使用 window.show 方法来显示窗口，并使用 app.exec_ 方法来维持窗口更新。
#       同时，我们也检查用户是否按下 q 键或关闭窗口，如果是，则跳出循环并结束程序。最后，我们释放摄像头资源并销毁所有窗口。


# 导入必要的模块
import sys
import cv2
from PySide2.QtWidgets import QApplication, QWidget, QLabel
from PySide2.QtGui import QPixmap, QImage

# 创建一个 pyopenpose 对象，指定模型路径和参数
sys.path.append('build/python')
import src.utils.openpose.pyopenpose as op

params = dict()
params["model_folder"] = r"../utils/openpose/models/"
opWrapper = op.WrapperPython()
opWrapper.configure(params)
opWrapper.start()

# 创建一个 PyQt 窗口，显示摄像头画面和姿态估计结果
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt + OpenPose")
window.resize(800, 600)

label1 = QLabel(window)
label1.resize(400, 300)
label1.move(0, 0)

label2 = QLabel(window)
label2.resize(400, 300)
label2.move(400, 0)

cap = cv2.VideoCapture(0)

while True:
    # 从摄像头读取一帧图像，并转换为 RGB 格式
    ret, frame = cap.read()
    if not ret:
        break
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 将图像传入 openpose 处理，得到人体关键点和渲染图像
    datum = op.Datum()
    datum.cvInputData = frame_rgb
    opWrapper.emplaceAndPop([datum])
    keypoints = datum.poseKeypoints  # shape: (num_persons, num_keypoints, 3)
    output_image = datum.cvOutputData

    # 将原始图像和渲染图像转换为 QImage 格式，并显示在标签上
    height1, width1, channel1 = frame_rgb.shape
    bytesPerLine1 = channel1 * width1
    qImg1 = QImage(frame_rgb.data.tobytes(), width1, height1,
                   bytesPerLine1,
                   QImage.Format_RGB888).scaled(label1.width(), label1.height())

    height2, width2, channel2 = output_image.shape
    bytesPerLine2 = channel2 * width2
    qImg2 = QImage(output_image.data.tobytes(), width2, height2,
                   bytesPerLine2,
                   QImage.Format_RGB888).scaled(label2.width(), label2.height())

    label1.setPixmap(QPixmap.fromImage(qImg1))
    label2.setPixmap(QPixmap.fromImage(qImg2))

    # 维持窗口更新，并处理退出事件
    window.show()
    if (cv2.waitKey(10) & 0xFF == ord('q')) or (app.exec_() == 0):
        break

cap.release()
cv2.destroyAllWindows()
